package main

import "fmt"

// Go语言是静态类型语言，因此变量（variable）是有明确类型的，编译器也会检查变量类型的正确性。

/* Go语言的基本类型：
bool
string
int、int8、int16、int32、int64
uint、uint8、uint16、uint32、uint64、uintptr
byte // uint8 的别名
rune // int32 的别名 代表一个 Unicode 码
float32、float64
complex64、complex128
*/

// 当一个变量被声明之后，系统自动赋予它该类型的零值：int为0，float为0.0，bool为false，string为空字符串，指针为nil等。所有的内存在Go中都是经过初始化的。
// 变量的命名规则遵循骆驼命名法。

// 声明变量的一般形式是使用var关键字，格式如下：
// var name type

/* 关键字

break		default 	func	interface	select
case		defer		go		map			struct
chan		else		goto	package		switch
const		fallthrough	if		range		type
continue	for	import	return	var

*/

/* 标识符

标识符是指Go语言对各种变量、方法、函数等命名时使用的字符序列，标识符由若干个字母、下划线_、和数字组成，且第一个字符必须是字母。

下划线_是一个特殊的标识符，称为空白标识符，它可以像其他标识符那样用于变量的声明或赋值（任何类型都可以赋值给它），但任何赋给这个标识符的值都将被抛弃，因此这些值不能在后续的代码中使用，也不可以使用_作为变量对其它变量进行赋值或运算。

在使用标识符之前必须进行声明，声明一个标识符就是将这个标识符与常量、类型、变量、函数或者代码包绑定在一起。在同一个代码块内标识符的名称不能重复。

标识符的命名需要遵守以下规则：
由26个英文字母、0~9、_组成
不能以数字开头，例如var 1num int是错误的
Go语言中严格区分大小写
标识符不能包含空格
不能以系统保留关键字作为标识符，比如break、if等等

命名标识符时还需要注意以下几点：
标识符的命名要尽量采取简短且有意义
不能和标准库中的包名重复
为变量、函数、常量命名时采用驼峰命名法，例如stuName、getVal

当然Go语言中的变量、函数、常量名称的首字母也可以大写，如果首字母大写，则表示它可以被其它的包访问（类似于Java中的public）；如果首字母小写，则表示它只能在本包中使用（类似于Java中private）。

预定义不可以当做标识符来使用。

*/

func main() {

	var i = 1

	var a, b *int
	a = &i
	b = &i
	fmt.Println(*a, b)

	// 批量格式
	var (
		c int
		d string
		e []float32
		f func() bool
		g struct {
			x int
		}
	)

	fmt.Println(c, d, e, f, g)

	// 简短格式
	j := 10
	fmt.Println(j)

	m, n := 100, "abc"
	fmt.Println(m, n)
}
